﻿// @include "Array.js"
// @include "Argument.js"
// @include "../extend/Debug.js"
/**
 * @fileOverview 命名空间实现工具
 * 
 * @version qinglan_Object 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 命名空间实现类
 * 
 * @type Object
 */
qinglan.Namespace = qinglan.Namespace || {};
/**
 * 进行命名空间分割
 * 
 * @param {String}
 *            nameSpace 命名空间以'.'分割
 * @return {Object} ns：命名空间分割数组, len : 命名空间分割长度
 */
qinglan.Namespace._parseNamespace = function(nameSpace) {
	var nsArray = nameSpace.split('.');
	return {
		ns : nsArray,
		len : nsArray.length
	};
};
/**
 * 创建命名空间,如果没有指定上下文,默认是window
 * 
 * @param {String}
 *            nameSpace 命名空间以'.'分割
 * @param {Object}
 *            context 上下文
 * @param {Boolean}
 *            ismanual 是否手动完成最后对象初始化
 */
qinglan.Namespace.create = function(nameSpace, context, ismanual) {
	context = context || window;
	var nsObj = qinglan.Namespace._parseNamespace(nameSpace);
	var nsLast = qinglan.Array.getTheLast(nsObj.ns);
	for (var i = 0; i < nsObj.len - 1; i++) {
		context[nsObj.ns[i]] = context[nsObj.ns[i]] || {};
		context = context[nsObj.ns[i]] || {};
	}
	if (!ismanual) {
		!context[nsLast] && (context[nsLast] = {});
		context = context[nsLast];
	}
	return {
		instance : context,
		key : nsLast
	};
};
/**
 * 得到命名空间所指向的对象<br/> 当然,这里有更快的实现方式,用eval(nameSpace)即可,但是eval是高危函数,所以采取了这种方法
 * 
 * @param {String}
 *            nameSpace 命名空间以'.'分割
 * @param {Object}
 *            context 上下文,默认是window
 * @return {Object} 命名空间指向的对象
 */
qinglan.Namespace.get = function(nameSpace, context) {
	context = context || window;
	var nsObj = qinglan.Namespace._parseNamespace(nameSpace);
	for (var i = 0; i < nsObj.len; i++) {
		if (qinglan.Type.isUndefined(context[nsObj.ns[i]]) || qinglan.Type.isNull(context[nsObj.ns[i]])) {
			qinglan.Debug.info('The nameSpace : [' + nameSpace + '] is definded or null!!');
			return undefined;
		};
		context = context[nsObj.ns[i]];
	}
	return context;
};
/**
 * 创建命名空间数组<br/> 根据传进来的arguments创建命名空间字串
 * 
 * @param {String}
 *            arguments 方法参数
 * 
 * @return {String} 命名空间字串
 */
qinglan.Namespace.generate = function() {
	var nsArray = [];
	qinglan.Array.each(qinglan.Argument.toArray(arguments), function(value) {
				nsArray.push(value);
			});
	return nsArray.join('.');
};
